package org.funtester.performance.books.chapter01.section4;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 动态线程池演示代码
 */
public class DynamicThreadPool {

    /**
     * 全局线程池
     */
    public static ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 3, 10L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100));

    /**
     * 封装线程池的execute方法
     * @param command 需要执行的任务
     */
    public static void execute(Runnable command) {
        dynamic();// 动态调整线程池
        executor.execute(command);// 提交任务
    }

    /**
     * 动态调整线程池,并不完美，仅供参考
     */
    public static void dynamic() {
        int size = executor.getQueue().size();
        if (size > 0) {// 如果队列中有任务
            increaseCorePoolSize();// 增加核心线程数
            if (size > 100) {
                increaseMaximumPoolSize();// 增加最大线程数
            } else {
                decreaseMaximumPoolSize();// 减少最大线程数
            }
        } else {
            decreaseCorePoolSize();// 减少核心线程数
        }
    }

    /**
     * 增加核心线程数,这里暂时不做线程安全处理
     */
    public static void increaseCorePoolSize() {
        int maximumPoolSize = executor.getMaximumPoolSize();// 获取最大线程数
        int corePoolSize = executor.getCorePoolSize();// 获取核心线程数
        if (corePoolSize < maximumPoolSize) {// 如果核心线程数小于最大线程数
            corePoolSize++;// 增加核心线程数
            executor.setCorePoolSize(corePoolSize);// 设置核心线程数
            System.out.println("增加核心线程数为：" + corePoolSize);
        }
    }

    /**
     * 减少核心线程数,这里暂时不做线程安全处理
     */
    public static void decreaseCorePoolSize() {
        int corePoolSize = executor.getCorePoolSize();// 获取核心线程数
        if (corePoolSize > 1) {// 如果核心线程数大于1
            corePoolSize--;// 减少核心线程数
            executor.setCorePoolSize(corePoolSize);// 设置核心线程数
            System.out.println("减少核心线程数为：" + corePoolSize);
        }
    }

    /**
     * 增加最大线程数,这里暂时不做线程安全处理
     */
    public static void increaseMaximumPoolSize() {
        int maximumPoolSize = executor.getMaximumPoolSize();// 获取最大线程数
        maximumPoolSize++;// 增加最大线程数
        if (maximumPoolSize > 128) {
            return;// 最大线程数不超过128
        }
        executor.setMaximumPoolSize(maximumPoolSize);// 设置最大线程数
        System.out.println("增加最大线程数为：" + maximumPoolSize);
    }

    /**
     * 减少最大线程数,这里暂时不做线程安全处理
     */
    public static void decreaseMaximumPoolSize() {
        int maximumPoolSize = executor.getMaximumPoolSize();// 获取最大线程数
        if (maximumPoolSize <= 16) {
            return;// 最大线程数不小于16
        }
        maximumPoolSize--;// 减少最大线程数
        executor.setMaximumPoolSize(maximumPoolSize);// 设置最大线程数
        System.out.println("减少最大线程数为：" + maximumPoolSize);
    }

}
